#include <cstring>
#include <cstdint>
#include <iostream>

//指针概念与使用
int main() {
    int a; //定义一个整型变量a
    int* a_pointer = &a; //定义一个指向整型的指针a_pointer，并指向a的地址，指针本身的大小通常是4个字节(32位系统),如果是64位系统则是8个字节

    std::cout << "a的字节大小为:" << sizeof(a) << std::endl;
    std::cout << "a_pointer的字节大小为:" << sizeof(a_pointer) << std::endl;

    //   |---1---||---2---||---3---||---4---|
    a = 0b00000001'00000010'00000011'00000100; //二进制赋值
    std::cout << "a的值为:" << a << std::endl;

    //此时定义一个uint8_t类型数组
    //uint8_t是8bit二进制数据，也就是1个字节，所以一个长度为4的uint8_t类型的数组，大小为32bit，就是4个字节，在内存层面与int类型大小相同
    uint8_t a_array[4];

    //数组本质上是一个指针，指向数组的第一个元素，所以可以直接将uint8_t数组赋值给uint8_t指针
    uint8_t* a_array_pointer = a_array; //定义一个指向uint8_t类型的指针a_array_pointer，并指向a_array的地址

    //将a的值赋值给a_array
    std::memcpy(a_array, &a, sizeof(a)); //memcpy函数用于内存拷贝，的一个参数是目标地址，第二个参数是源地址，第三个参数是拷贝的字节数

    //遍历a_array数组,原本a的内存数据被分解为4个字节，分别赋值给a_array的4个元素
    for(int i = 0; i < 4; i++) {
        std::cout << "a_array[" << i << "]的值为:" << static_cast<int>(a_array[i]) << std::endl;
    }

}